#include "wx/wxprec.h"
#if wxUSE_LISTBOX

#include "wx/listbox.h"

// ============================================================================
// implementation
// ============================================================================

wxListBoxBase::~wxListBoxBase() {
  // this destructor is required for Darwin
}

// ----------------------------------------------------------------------------
// adding items
// ----------------------------------------------------------------------------

void wxListBoxBase::InsertItems( unsigned int nItems, const wxString *items, unsigned int pos ) {
  wxArrayString aItems;
  for( unsigned int n = 0; n < nItems; n++ ) {
    aItems.Add( items[n] );
  }
  DoInsertItems( aItems, pos );
}


void wxListBoxBase::Set( int nItems, const wxString* items, void **clientData ) {
  wxArrayString aItems;
  for( int n = 0; n < nItems; n++ ) {
    aItems.Add( items[n] );
  }
  DoSetItems( aItems, clientData );
}

// ----------------------------------------------------------------------------
// selection
// ----------------------------------------------------------------------------

bool wxListBoxBase::SetStringSelection( const wxString& s, bool select ) {
  const int sel = FindString( s );
  if( sel == wxNOT_FOUND ) {
    return false;
  }
  SetSelection( sel, select );
  return true;
}

void wxListBoxBase::DeselectAll( int itemToLeaveSelected ) {
  if( HasMultipleSelection() ) {
    wxArrayInt selections;
    GetSelections( selections );
    size_t count = selections.GetCount();
    for( size_t n = 0; n < count; n++ ) {
      int item = selections[n];
      if( item != itemToLeaveSelected ) {
        Deselect( item );
      }
    }
  } else { // single selection
    int sel = GetSelection();
    if( sel != wxNOT_FOUND && sel != itemToLeaveSelected ) {
      Deselect( sel );
    }
  }
}

// ----------------------------------------------------------------------------
// misc
// ----------------------------------------------------------------------------

void wxListBoxBase::Command( wxCommandEvent& event ) {
  SetSelection( event.GetInt(), event.GetExtraLong() != 0 );
  ( void )ProcessEvent( event );
}

// ----------------------------------------------------------------------------
// SetFirstItem() and such
// ----------------------------------------------------------------------------

void wxListBoxBase::SetFirstItem( const wxString& s ) {
  int n = FindString( s );
  wxCHECK_RET( n != wxNOT_FOUND, wxT( "invalid string in wxListBox::SetFirstItem" ) );
  DoSetFirstItem( n );
}

void wxListBoxBase::AppendAndEnsureVisible( const wxString& s ) {
  Append( s );
  EnsureVisible( GetCount() - 1 );
}

void wxListBoxBase::EnsureVisible( int ( n ) ) {
  // the base class version does nothing (the only alternative would be to
  // call SetFirstItem() but this is probably even more stupid)
}

#endif // wxUSE_LISTBOX
